// ==================== Tabbar页面逻辑：分类 ====================
// 首页API请求函数
import {getClassifyList,getGoodsList,getSearchRecommend} from '../../api/mainApi' 

import {getCartAllGoodsNum} from '../../api/cartApi'

let lastY = 0 // 上一次移动的位置
let scale = 750 / wx.getSystemInfoSync().windowWidth // rpx转化比例

Page({
  
  data: {
    menuTop: getApp().menuCapsulePosition.top, //胶囊菜单距离顶部的位置
    screenUsableHeight:0, // 当前设备屏幕可用高度
    screenUsableWidth:getApp().availableWindow.width,
    hostSearchList:[], // 搜索列表推荐
    goodsTypes:[], // 商品分类列表
    pageNum:0, // 商品页码
    selectiveType:'', // 当选择的商品类型id
    goodsList:[], // 商品列表
    hasNextPage:true, //是否还有下一页,
    goodsScrollTop:0, // 商品滚动条位置
    translateHeight:0, // 平移高度
    scrollTop:0, // 页面滚动位置
    refreshState:-1 , // 页面刷新状态
    upperDistance:150, //下拉刷新的阈值 
    backgroundColor:'background-color:#fff', // 背景色
  },
  
  // ====== 页面生命周期函数：页面启动时执行 ======
  onLoad:function(){
     // 初始化页面默认数据
     this.initDefaultData()
     // 初始化屏幕可用高度
     this.initscreenUsableHeight()
  },

  // 页面显示时，触发该回调函数
  onShow:function(){
    console.log("main页面的show函数执行了");
    // 同步当前页面的商品选择数量
    this.syncGoodsAmount()
    getApp().initialCartTabBarBadge()
  },

  // 监听页面的滚动
  onPageScroll:function(e){
    console.log("监听页面滚动",e);
    this.data.scrollTop = e.scrollTop
  },


  /**
   * 触发下拉刷新时执行
   */
  onPullDownRefresh:function(){
     // 初始化当前页面的数据：搜索框内容、购物车徽标内容、商品列表、分类列表
     this.initDefaultData().then(()=>{
       // 停止当前下拉刷新
       wx.stopPullDownRefresh()
     })
  },


  /**
   * 初始化首页 搜索框中的内容
   */
  initialSearchContent(){
    getSearchRecommend().then(res=>{
      this.setData({
        hostSearchList:res.searchRecomment
      })
    })
  },

  /**
   * 同步商品数量：当离开当前页面时，如果在别的页面的（如购物车）对商品选择数量
   * 进行修改，再回到当前页面时，需要保持同步
   */
  syncGoodsAmount(){
    if(getApp().token){
      // 请求购物车中每种商品的数量
      getCartAllGoodsNum().then(data=>{
        let goodsList = this.data.goodsList
        // 将当前页面商品选中数量归零
        goodsList.forEach(item=>item.selectAmount = 0)
        data.goodsList.forEach(item=>{
          goodsList.forEach((goods)=>{
            // 将当前页面的商品选择数量与改变后的进行同步
            if(item.goodsId === goods.commodity_id){
              goods.selectAmount = item.amount
            }
          })
        })
        //  将保持同步的数据更新到页面渲染
       this.setData({goodsList: goodsList})
      })
    }
  },

    /**
     * 初始化当前页面的数据：搜索框内容、购物车徽标内容、商品列表、分类列表
     */
    initDefaultData:function(){
       // 初始化首页搜索框中内容
       this.initialSearchContent()
       // 初始化购物车tabbar徽标
       getApp().initialCartTabBarBadge()
       return new Promise(reslove=>{
         // 请求商品分类列表，成功的回调函数参数为当前选择的商品类型
         this.initialClassifys().then(selectiveType=>{
          // 请求商品列表
          this.requestGoodsList(0,15,selectiveType).then(()=>reslove())
        })
       })
    },


    /**
     * 初始化商品分类列表
     */
    initialClassifys(){
      return new Promise((reslove,reject)=>{
        // 请求商品分类列表
        getClassifyList().then((data)=>{
          //  let goodsTypes =  data.commodity_type;
          // 获取分类列表
           let goodsTypes =  data.goodsType;
           let curType = this.data.selectiveType
           this.setData({
              goodsTypes:goodsTypes, // 更新分类列表
              selectiveType:curType? curType:goodsTypes[0].id // 初始化当前商品类型
           })
           reslove(this.data.selectiveType)
        }).catch(err=>reject(err))
     })
    },


    // ----------  请求指定类型、页码的商品数据  -----------
    requestGoodsList:function(pageNum,pageSize,type){
      return new Promise((reslove,reject)=>{
        wx.showLoading({ title: '拼命加载中...', mask:true })
        // 请求商品列表
        getGoodsList(pageNum,pageSize,type).then(data=>{
          if(data.commodity_list.length<1){
            wx.hideLoading() // 关闭加载中提示
            wx.showToast({
              title: '抱歉该分类还没有商品！',
              duration:2000,
              icon:'none'
            })
          }
          // 当前页码大于一，表示有缓存，将之前商品与当前请求商品合并
          if(pageNum > 0){
            data.commodity_list.unshift(...this.data.goodsList)
          }
          this.setData({
            goodsList:data.commodity_list, // 更新商品部数组
            pageNum:pageNum+1, // 页码加一
            selectiveType:type, // 更新选择的类型
            hasNextPage:data.isnext // 是否还有下一页
          })
          wx.hideLoading()
          reslove()
        }).catch(err=>{
          wx.hideLoading()// 关闭加载中提示
          wx.showToast({
            title: '服务器开小差了，请稍后重试！',
            icon:'none'
          })
          reject()
        })
      })
    },
    
    // -------------- 初始化当前页面可用屏幕高度  ----------------
     initscreenUsableHeight:function(){
      wx.getSystemInfo({
        success: (result) => {
          // 获取当前设备的屏幕可用高度
          const windowHeight = result.windowHeight
          this.setData({
            screenUsableHeight: windowHeight - this.data.menuTop -45
          })
        },
      })
    },
    //  ----------- 处理点击进入搜索页面事件 ------------
    handleClickSkipSearch:function(){
      console.log("点击进入搜索页面按钮");
      let data = this.data
      wx.navigateTo({
        url: '/pages/main/goodSearch/goodSearch',
        success:function(res){
          // 通过eventChannel来向打开的页面传递数据：传递的是搜索推荐列表
          res.eventChannel.emit('acceptDataFromMainPage',{
            hostSearchList:data.hostSearchList
          })
        }
      })
    },

    // -------- 处理点击分类事件 -------
    handleCutClassify:function(e){
      //  获取当前点击的商品类型
      let goodsType = this.data.goodsTypes[e.detail].id
      // 与当前类型一致，不做任何操作
      if(goodsType === this.data.selectiveType){
        return
      }
      this.data.pageNum = 0 // 初始化页码
      this.requestGoodsList(this.data.pageNum,15,goodsType).then(()=>{
         // 将商品列表滚动到顶部
          this.setData({goodsScrollTop:0})
      })
    },

    // ------- 处理商品列表滚动至底部事件 ------
    handleRollToLower:function(e){
      console.log("商品列表滚动条滚动至底部",e);
      if(this.data.hasNextPage){
        this.requestGoodsList(this.data.pageNum,15,this.data.selectiveType)
      }
    },

    /**
     * 监听页面手指触摸动作开始
     * @param {Object} e 事件对象
     */
    touchStart:function(e){
      console.log("手指触摸了页面：",e);
      lastY = e.touches[0].clientY
      this.setData({
        backgroundColor:'background-color:#16a913',
      })
    },

    /**
     * 监听页面手指触摸后移动
     * @param {Object} e 事件对象
     */
    touchMove:function(e){
      let clientY = e.touches[0].clientY // 触摸目标在视口中的y坐标
      let offset = clientY - lastY // 计算出当前拖动Y坐标和上一次拖动Y坐标的偏移量
      // 偏移量小于0，就是向上拖动
      if(offset < 0){
        this.stopRefresh() // 取消刷新
        return
      }
      if(this.data.scrollTop > 0) return

      this.data.translateHeight += offset // 初始化位移的高度
      this.data.refreshState = 0 // 初始化刷新的状态为0：表示下拉中
      lastY = e.touches[0].clientY // 将本次移动视口中Y坐标缓存
      // if(this.data.translateHeight - this.data.scrollTop * scale > this.data.upperDistance){
        // 如果拖动距离大于指定的下拉刷新距离，修改刷新状态为1：松开刷新
      if(this.data.translateHeight > this.data.upperDistance){
        this.data.refreshState = 1
      }
      this.setData({
        translateHeight:this.data.translateHeight,
        refreshState:this.data.refreshState
      })
    },

    /**
     * 监听页面手指触摸动作结束
     * @param {Object} e 
     */
    touchEnd:function(e){
      console.log("手指触摸页面动作结束",e);
      // if(this.data.translateHeight - this.data.scrollTop * scale > this.data.upperDistance){
      if(this.data.translateHeight > this.data.upperDistance){
        this.setData({
          translateHeight:150,
          refreshState:2
        })
        // 初始化当前页面的数据：搜索框内容、购物车徽标内容、商品列表、分类列表
        this.initDefaultData().then(()=>{
          // 延迟0.5s停止当前下拉刷新
          setTimeout(()=>this.stopRefresh(),500)
        })
      }else if(this.data.scrollTop <=0){
        this.stopRefresh()
      }
    },

    /**
     * 停止刷新
     */
    stopRefresh(){
      this.setData({
        translateHeight:0,
        refreshState:-1,
      },()=>{
        wx.pageScrollTo({
          scrollTop:0,
          duration: 0,
        })
      })
    }



})